home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
651-660
/
658
/
view
/
source
/
print.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-15
|
6KB
|
177 lines
/*-- AutoRev header do NOT edit!
*
* Program : Print.c
* Copyright : Copyright © 1991-92 Jaba Development
* Author : Jan van den Baard
* Creation Date : 05-Apr-92
* Current version : 2.0
* Translator : Dice v2.06.40
*
* REVISION HISTORY
*
* Date Version Comment
* --------- ------- ------------------------------------------
* 05-Apr-92 2.0 Printer routines. (rewrite)
*
*-- REV_END --*/
#include "View.h"
Prototype void PrintFile( void );
Prototype long CheckPrinter( void );
Prototype __geta4 void PrintProc( void );
extern struct Screen *vwScreen;
extern struct Window *vwWindow;
extern struct RastPort *vwRPort;
extern struct AsciiText *vwText;
extern struct Line *vwFirst, *vwLast;
extern struct TextFont *vwFont;
extern struct TextBlock vwBlocks[];
extern UWORD vwPMark, vwPMode;
extern UBYTE vwPrinting;
extern ULONG vwClass;
#ifdef __DETACH
extern ULONG *vwArgs;
#else
extern ULONG vwArgs[];
#endif
extern __far struct Custom custom;
void PrintFile( void )
{
if ( ! vwText ) return;
if ( vwPMode == PRT_BLOCK ) {
if ( ! CheckBlock( vwPMark ))
return;
}
if ( ! CreateNewProcTags( NP_Entry, PrintProc,
NP_StackSize, 4096L,
NP_Name, "ViewPrinting",
NP_Cli, TRUE,
TAG_DONE ))
Error( "Can't start the printing process." );
else {
while( ! FindTask( "ViewPrinting" ));
vwPrinting = TRUE;
}
}
long CheckPrinter( void )
{
struct Data {
UBYTE LSB, MSB;
} data;
struct MsgPort *port;
struct IOStdReq *pio;
UBYTE *ptr;
long ret = TRUE;
UBYTE ch = FALSE;
if ( port = CreateMsgPort()) {
if ( pio = CreateStdIO( port )) {
if ( ! OpenDevice( "printer.device", NULL, ( struct IORequest * )pio, NULL )) {
retry:
pio->io_Data = (APTR)&data;
pio->io_Command = PRD_QUERY;
DoIO(( struct IORequest * )pio );
if (( data.LSB & 1 ) || ( data.LSB & 2 )) {
if( vwArgs[ 11 ] ) {
vwArgs[ 11 ] = NULL;
ch = TRUE;
ON_SPRITE;
}
if ( rtEZRequestTags( "Your printer isn't online or\nyou must insert paper.",
"Retry|Cancel",
NULL,
NULL,
RT_Window, vwWindow,
RT_ReqPos, REQPOS_CENTERSCR,
RTEZ_Flags, EZREQF_CENTERTEXT,
RTEZ_ReqTitle, CX_NAME ": Printer trouble...",
TAG_DONE ))
goto retry;
else
ret = FALSE;
}
CloseDevice(( struct IORequest * )pio );
}
DeleteIORequest(( struct IORequest * )pio );
}
DeleteMsgPort( port );
}
if ( ptr = AllocMem( 102857600, MEMF_ANY ))
FreeMem( ptr, 102857600 );
if ( ch ) {
vwArgs[ 11 ] = ~0;
OFF_SPRITE;
}
return( ret );
}
__geta4 void PrintProc( void )
{
struct BuffIO *pfile = NULL;
struct Window *pwin = NULL;
struct Line *l, *t;
UBYTE *title = "Printing...";
if ( ! CheckPrinter())
goto CleanExit;
if ( pfile = BOpen( "PRT:", MODE_NEWFILE )) {
if ( pwin = OpenWindowTags( NULL, WA_Width, TextLength( vwRPort, title, 11 ) + 20,
WA_Height, vwScreen->WBorTop + vwFont->tf_YSize + 1,
WA_Title, title,
WA_IDCMP, IDCMP_CLOSEWINDOW,
WA_Flags, WFLG_SMART_REFRESH | WFLG_CLOSEGADGET | WFLG_DRAGBAR | WFLG_RMBTRAP,
WA_CustomScreen, vwScreen,
TAG_DONE )) {
switch( vwPMode ) {
case PRT_PAGE:
l = vwFirst;
t = vwLast;
break;
case PRT_FILE:
l = vwText->First;
t = vwText->Last->Next;
break;
case PRT_BLOCK:
l = vwBlocks[ vwPMark ].TopLine;
t = vwBlocks[ vwPMark ].BottomLine;
break;
}
for ( ; l != t; l = l->Next ) {
if ( ReadMsgPort( pwin->UserPort )) {
if ( vwClass == IDCMP_CLOSEWINDOW )
goto CleanExit;
}
BPutS( pfile, l );
}
} else
Error( "Could not open the printer window." );
} else
Error( "Printer trouble." );
CleanExit:
if ( pwin ) CloseWindow( pwin );
if ( pfile ) BClose( pfile );
vwPrinting = FALSE;
}